/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.comandos;

import br.ufc.quixada.adrs.grafico.ADRSBarChart;
import br.ufc.quixada.adrs.grafico.ADRSPercentBarChart;
import br.ufc.quixada.adrs.grafico.ADRSStackedBarChart;
import br.ufc.quixada.adrs.grafico.DataSetFactory;
import br.ufc.quixada.adrs.interfaces.Comando;
import br.ufc.quixada.adrs.model.RelatorioQualitativoResult;
import br.ufc.quixada.adrs.model.RelatorioResult2;
import br.ufc.quixada.adrs.util.Msg;
import java.awt.Dimension;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.slf4j.LoggerFactory;

/**
 *
 * @author jefferson
 */
public class CmdGrafico implements Comando {

    private JFreeChart chart;
    private int width = 1000, height = 350;

    public synchronized String executa(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        String chartChosen = request.getParameter("tipo_grafico");

        String title = "";
        String eixoX = "";
        String eixoY = "";
        if (chartChosen.equals(Msg.GRAPHIC_QT_MOVIMENTACOES)) {
            //capturar informações para montar o gráfico         
            List<RelatorioResult2> result = (List<RelatorioResult2>) session.getAttribute("relatorioResult");
            Long id = Long.parseLong(request.getParameter("id"));
            RelatorioResult2 relatorio = null;

            for (RelatorioResult2 r : result) {
                if (r.getPrudutor().getId().equals(id)) {
                    relatorio = r;
                    break;
                }
            }
            List<String> nomes = relatorio.getFiltros();
            List<Date> datas = relatorio.getDatas();
            List<Integer> valores = relatorio.getDados();

            ADRSBarChart chartTeste = new ADRSBarChart(title, eixoX, eixoY, Msg.GRAPHIC_QT_MOVIMENTACOES);
            //this.chart = chartTeste.createChart(DataSetFactory.createADRSBarChartDataset());            
            this.chart = chartTeste.createChart(DataSetFactory.createADRSBarChartDatasetQT(nomes, valores, datas));

        } else if (chartChosen.equals(Msg.GRAPHIC_QT_MOVIMENTACOES_GERAL)) {
            String periodo = (String) session.getAttribute("periodo");
            List<Integer> valores = (ArrayList<Integer>) session.getAttribute("somaTotal");
            //String[] filtros = (String[]) session.getAttribute("filtros");
            List<String> filtros = (ArrayList<String>) session.getAttribute("filtros");
            ADRSBarChart chartTeste = new ADRSBarChart(title, eixoX, eixoY, Msg.GRAPHIC_QT_MOVIMENTACOES_GERAL);
            this.chart = chartTeste.createChart(DataSetFactory.createADRSBarChartDataset(filtros, valores, periodo.toUpperCase()));

        } else if (chartChosen.equals(Msg.GRAPHIC_QS_DOENCAS_GERAL)) {
            String[] filtros = (String[]) session.getAttribute("filtros");
            int[] dados = (int[]) session.getAttribute("dados");
            ADRSBarChart chartTeste = new ADRSBarChart(title, eixoX, eixoY, Msg.GRAPHIC_QS_DOENCAS_GERAL);
            this.chart = chartTeste.createChart(DataSetFactory.createADRSBarChartDatasetQS(filtros, dados));

        } else if (chartChosen.equals(Msg.GRAPHIC_QT_DESCARTES_GERAL)) {
            List<Integer> valores = (ArrayList<Integer>) session.getAttribute("somaTotal");
            //List<String> nomes = (ArrayList<String>) session.getAttribute("filtros");
            List<String> series = (List<String>) session.getAttribute("seriesGrafico");
            List<Date> datas = (List<Date>) session.getAttribute("datasGrafico");

            //removendo a coluna com o total de descartes do período
            valores.remove(valores.size() - 1);
            //nomes.remove(nomes.size() - 1);

            ADRSBarChart chartTeste = new ADRSBarChart(title, eixoX, eixoY, Msg.GRAPHIC_QT_DESCARTES_GERAL);
//            this.chart = chartTeste.createChart(DataSetFactory.createADRSBarChartDatasetQTDescarte(nomes, valores));
            this.chart = chartTeste.createChart(DataSetFactory.createADRSBarChartDatasetQT(series, valores, datas));
        } else if (chartChosen.equals(Msg.GRAPHIC_QL_AVALIACAO)) {
            String tipoAvaliacao = request.getParameter("tipo_av");
            List<RelatorioQualitativoResult> relatorio = null;
            if (tipoAvaliacao.equals(Msg.AVA_GERAL)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvGeral");
                ADRSBarChart chartTeste = new ADRSBarChart(title, eixoY, eixoY, Msg.GRAPHIC_QL_AVALIACAO);
                this.chart = chartTeste.createChart(DataSetFactory.createDatasetTecnologico(relatorio));
            } else if (tipoAvaliacao.equals(Msg.AVA_INSTALACOES)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvInstalacao");
                ADRSBarChart chartTeste = new ADRSBarChart(title, eixoY, eixoY, Msg.GRAPHIC_QL_AVALIACAO);
                this.chart = chartTeste.createChart(DataSetFactory.createDatasetTecnologico(relatorio));
            } else if (tipoAvaliacao.equals(Msg.AVA_NUTRICIONAL)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvNutricional");
                ADRSBarChart chartTeste = new ADRSBarChart(title, eixoY, eixoY, Msg.GRAPHIC_QL_AVALIACAO);
                this.chart = chartTeste.createChart(DataSetFactory.createDatasetTecnologico(relatorio));
            } else if (tipoAvaliacao.equals(Msg.AVA_ORGANIZACIONAL)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvOrganizacional");
                ADRSBarChart chartTeste = new ADRSBarChart(title, eixoY, eixoY, Msg.GRAPHIC_QL_AVALIACAO);
                this.chart = chartTeste.createChart(DataSetFactory.createDatasetTecnologico(relatorio));
            } else if (tipoAvaliacao.equals(Msg.AVA_REPRODUTIVA)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvReprodutiva");
                ADRSBarChart chartTeste = new ADRSBarChart(title, eixoY, eixoY, Msg.GRAPHIC_QL_AVALIACAO);
                this.chart = chartTeste.createChart(DataSetFactory.createDatasetTecnologico(relatorio));
                //ADRSStackedBarChart chartTeste = new ADRSStackedBarChart("");
                //this.chart = chartTeste.criarChart(DataSetFactory.createDatasetTecnologico(relatorio), Msg.GRAPHIC_QL_AVALIACAO, PlotOrientation.VERTICAL);
            } else if (tipoAvaliacao.equals(Msg.AVA_SANITARIA)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvSanitaria");
                ADRSBarChart chartTeste = new ADRSBarChart(title, eixoY, eixoY, Msg.GRAPHIC_QL_AVALIACAO);
                this.chart = chartTeste.createChart(DataSetFactory.createDatasetTecnologico(relatorio));
            }
        } else if (chartChosen.equals(Msg.GRAPHIC_QL_TIPO_RESPOSTA)) {
            String tipoAvaliacao = request.getParameter("tipo_av");
            String quantResult = (String) session.getAttribute("quantResult");
            String porcentagem = (String) session.getAttribute("porcentResult");
            String tipoResposta = (String) session.getAttribute("tipoResposta");
            Integer respostaNumerica = (Integer) session.getAttribute("respostaNumerica");

            List<RelatorioQualitativoResult> relatorio = null;
            if (tipoAvaliacao.equals(Msg.AVA_GERAL)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvGeral");
            } else if (tipoAvaliacao.equals(Msg.AVA_INSTALACOES)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvInstalacao");
            } else if (tipoAvaliacao.equals(Msg.AVA_NUTRICIONAL)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvNutricional");
            } else if (tipoAvaliacao.equals(Msg.AVA_ORGANIZACIONAL)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvOrganizacional");
            } else if (tipoAvaliacao.equals(Msg.AVA_REPRODUTIVA)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvReprodutiva");
            } else if (tipoAvaliacao.equals(Msg.AVA_SANITARIA)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvSanitaria");
            }

            if (quantResult != null) {
                ADRSBarChart geradorGrafico = new ADRSBarChart(title, eixoY, eixoY, Msg.GRAPHIC_QL_TIPO_RESPOSTA);
                this.chart = geradorGrafico.createChart(DataSetFactory.createDatasetQLTipoResposta(relatorio, tipoResposta, respostaNumerica));
            }
            if (porcentagem != null) {
                ADRSPercentBarChart geradorGrafico = new ADRSPercentBarChart(title, eixoY, eixoY, Msg.GRAPHIC_QL_AVALIACAO_PORCENTAGEM);
                this.chart = geradorGrafico.createChart(DataSetFactory.createDatasetQLPorcentagemTipoResposta(relatorio, tipoResposta, respostaNumerica), null, PlotOrientation.VERTICAL);
            }
        } else if (chartChosen.equals(Msg.GRAPHIC_QL_TIPO_RESPOSTA_PORC_QUANTIDADE)) {
            String tipoAvaliacao = request.getParameter("tipo_av");
            String quantResult = (String) session.getAttribute("quantResult");
            String porcentagem = (String) session.getAttribute("porcentResult");
            String tipoResposta = (String) session.getAttribute("tipoResposta");
            Integer respostaNumerica = (Integer) session.getAttribute("respostaNumerica");

            List<RelatorioQualitativoResult> relatorio = null;
            if (tipoAvaliacao.equals(Msg.AVA_GERAL)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvGeral");
            } else if (tipoAvaliacao.equals(Msg.AVA_INSTALACOES)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvInstalacao");
            } else if (tipoAvaliacao.equals(Msg.AVA_NUTRICIONAL)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvNutricional");
            } else if (tipoAvaliacao.equals(Msg.AVA_ORGANIZACIONAL)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvOrganizacional");
            } else if (tipoAvaliacao.equals(Msg.AVA_REPRODUTIVA)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvReprodutiva");
            } else if (tipoAvaliacao.equals(Msg.AVA_SANITARIA)) {
                relatorio = (ArrayList<RelatorioQualitativoResult>) session.getAttribute("relAvSanitaria");
            }
            ADRSPercentBarChart geradorGrafico = new ADRSPercentBarChart(title, eixoY, eixoY, Msg.GRAPHIC_QL_TIPO_RESPOSTA_PORC_QUANTIDADE);
            this.chart = geradorGrafico.createChart(DataSetFactory.createDatasetQLTipoResposta(relatorio, tipoResposta, respostaNumerica), DataSetFactory.createDatasetQLPorcentagemTipoResposta(relatorio, tipoResposta, respostaNumerica), PlotOrientation.VERTICAL);
            this.height = 400;
        }

        //gerando grafico
        {
            try {
                File image = File.createTempFile("image", "tmp");
                // String caminho=image.getPath();

                //File fileDefinitive = new File("graficoImage","tmp");

                //criando chart de teste
                ChartPanel chartPanel = new ChartPanel(chart, false);
                chartPanel.setPreferredSize(new Dimension(width, height - 30));
                // Assume that we have the chart
                ChartUtilities.saveChartAsPNG(image, chart, width, height);

                FileInputStream fileInStream = new FileInputStream(image);
                OutputStream outStream = response.getOutputStream();

                long fileLength;
                byte[] byteStream;

                fileLength = image.length();
                byteStream = new byte[(int) fileLength];
                fileInStream.read(byteStream, 0, (int) fileLength);
                response.setContentType("image/png");
                response.setContentLength((int) fileLength);

                response.setHeader("pragma", "no-cache");
                response.setHeader("cache-control", "no-cache");
                response.setDateHeader("expires", 0);


                fileInStream.close();
                outStream.write(byteStream);
                outStream.flush();
                outStream.close();

            } catch (IOException ex) {
                LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            }


        }
        return "";
    }
}
